package com.miaoda.miaoda_ai.core.saver;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.miaoda.miaoda_ai.ai.model.HtmlCodeResult;
import com.miaoda.miaoda_ai.constant.AppConstant;
import com.miaoda.miaoda_ai.model.enums.CodeGenTypeEnum;

import java.io.File;

/**
 * 代码保存模板   模板方法模式
 *
 * @param <T>
 */
public abstract class CodeFileSaverTemplate<T> {

    /**
     * 文件保存根路径
     */
    private static final String FILE_SAVE_ROOT_DIR = AppConstant.CODE_OUTPUT_ROOT_DIR;

    /**
     *  统一代码保存到文件的流程
     * @param codeResult 输入
     * @param appId 应用id
     * @return 保存的文件
     */
    public final File saveCode(T codeResult,Long appId) {
        // 1.验证虽输入
        validateInput(codeResult);
        // 3.保存文件（子类）
        String dirPath = saveFiles(codeResult,appId);
        // 4.返回保存的文件
        return new File(dirPath);
    }

    /**
     * 保存文件
     *
     * @param codeResult 输入
     */
    protected abstract String saveFiles(T codeResult,Long appId);

    /**
     * 验证输入
     *
     * @param codeResult 输入
     */
    protected abstract void validateInput(T codeResult);


    /**
     * 构建唯一文件路径
     * * @return
     */
    protected final String buildUniqueFilePath(Long appId) {
        String bizType = getCodeGenType().getValue();
        // 生成唯一文件名,使用雪花算法
        String uniqueFileName = StrUtil.format("{}_{}", bizType,appId);
        String dirPath = FILE_SAVE_ROOT_DIR + File.separator + uniqueFileName;
        FileUtil.mkdir(dirPath);
        return dirPath;

    }

    /**
     * 获取代码生成类型
     *
     * @return 返回代码生成类型
     */
    protected abstract CodeGenTypeEnum getCodeGenType();

    /**
     * 保存代码到文件
     *
     * @param   content 代码内容
     * @param fileName 文件名
     * @return
     */
    protected void saveCodeToFile(String content, String fileName, String dirPath) {
        FileUtil.writeString(content,dirPath+ File.separator + fileName, "UTF-8");
    }


}
